
package com.loan.rebate.adminuser.service;

import java.util.Date;
import java.util.UUID;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.loan.rebate.adminuser.dao.TokenDao;
import com.loan.rebate.adminuser.entity.TokenVO;
import com.loan.rebate.adminuser.param.TokenParam;

/**
 * 临时会话tokenService实现类
 *
 * @author 朱国军
 * @version 2016年04月25日 朱国军
 */
@Service
public class TokenService {
    
    @Autowired
    private TokenDao tokenDao;
    
    private Logger logger = LoggerFactory.getLogger(TokenService.class);
    
    /**
     * 新增，注：返回的添加的条数，获取主键用entity.getId();
     *
     * @param userId 用户ID
     * @param maxTime 创建时间到当前时间的最大毫秒数
     * @return 新tokenId，-1 token请求频繁，-2 token生成失败
     */
    public String createToken(String userId, Long maxTime) {
        TokenVO tokenVO = queryByUserId(userId, maxTime);

        if (tokenVO != null) {
            return "-1";
        } else {
            tokenVO = new TokenVO();
            String tokenId = StringUtils.replace(UUID.randomUUID().toString(), "-", "");
            tokenVO.setTokenId(tokenId);
            tokenVO.setUserId(userId);
            Integer insertNum = tokenDao.insert(tokenVO);
            if (insertNum > 0) {
                return tokenId;
            } else {
                logger.error("新增token出错");
                return "-2";
            }
        }
    }
    
    /**
     * 根据ID获取临时会话token实体
     *
     * @param tokenId 主键
     * @param effectTime token的有效时间毫秒
     * @return 该token对应的用户ID，过期返回-1，不存在返回-2
     */
    public String validToken(String tokenId, Long effectTime) {
        TokenVO tokenVO = tokenDao.findById(tokenId);
        if (tokenVO == null) {
            return "-2";
        } else if ((System.currentTimeMillis() - tokenVO.getCreateTime().getTime()) > effectTime) {
            return "-1";
        } else {
            return tokenVO.getUserId();
        }
    }
    
    /**
     * 根据用户ID和时间查询最新的一个可用token
     *
     * @param userId 用户ID
     * @param maxTime 创建时间到当前时间的最大毫秒数
     * @return 临时会话token列表
     */
    public TokenVO queryByUserId(String userId, Long maxTime) {
        TokenParam tokenParam = new TokenParam();
        tokenParam.setUserId(userId);
        tokenParam.setCreateTimeBegin(new Date(System.currentTimeMillis() - maxTime));
        return tokenDao.queryByUserId(tokenParam);
    }
}
